//
//  Problem1266.swift
//  TestProject
//
//  Created by 毕武侠 on 2021/4/8.
//  Copyright © 2021 zhulong. All rights reserved.
//

import UIKit

/*
 1266. 访问所有点的最小时间
 平面上有 n 个点，点的位置用整数坐标表示 points[i] = [xi, yi] 。请你计算访问所有这些点需要的 最小时间（以秒为单位）。

 你需要按照下面的规则在平面上移动：

 每一秒内，你可以：
     沿水平方向移动一个单位长度，或者
     沿竖直方向移动一个单位长度，或者
     跨过对角线移动 sqrt(2) 个单位长度（可以看作在一秒内向水平和竖直方向各移动一个单位长度）。
     必须按照数组中出现的顺序来访问这些点。
     在访问某个点时，可以经过该点后面出现的点，但经过的那些点不算作有效访问。
  
 示例 1：
     输入：points = [[1,1],[3,4],[-1,0]]
     输出：7
     解释：一条最佳的访问路径是： [1,1] -> [2,2] -> [3,3] -> [3,4] -> [2,3] -> [1,2] -> [0,1] -> [-1,0]
     从 [1,1] 到 [3,4] 需要 3 秒
     从 [3,4] 到 [-1,0] 需要 4 秒
     一共需要 7 秒
 示例 2：

     输入：points = [[3,2],[-2,2]]
     输出：5
 提示：
     points.length == n
     1 <= n <= 100
     points[i].length == 2
     -1000 <= points[i][0], points[i][1] <= 1000
 */
@objcMembers class Problem1266: NSObject {
    func solution() {
        print(minTimeToVisitAllPoints([[1,1],[3,4],[-1,0]]))
        print(minTimeToVisitAllPoints([[3,2],[-2,2]]))
    }
    
    /*
     1: 取2个相连的元素s[i] s[j]，取出2个x和y间距 x1=s[i][0]-s[j][0]和y1=s[i][1]-s[j][1]
     2: 取出x1,y1较小的一个，例如：x1 = 2， y1=3，取x1=2，这2步走的是斜角，y1-=x1 = 1，剩下1步
     */
    func minTimeToVisitAllPoints(_ points: [[Int]]) -> Int {
        if points.count == 1 {
            return 0
        }
        var n = 0
        
        var x = points[0][0]
        var y = points[0][1]
        for i in 1..<points.count {
            x -= points[i][0]
            y -= points[i][1]
            
            if x < 0 {
                x = -x
            }
            if y < 0 {
                y = -y
            }
            
            if x < y {
                n += y
            } else {
                n += x
            }
            
            x = points[i][0]
            y = points[i][1]
        }
        return n
    }
}
